【今日湯底】
Take an integer n (n >= 0) and a digit d (0 <= d <= 9) as an integer.
Square all numbers k (0 <= k <= n) between 0 and n.
Count the numbers of digits d used in the writing of all the k**2.
Call nb_dig (or nbDig or ...) the function taking n and d as parameters and returning this count.
Examples:
n = 10, d = 1
the k*k are 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
We are using the digit 1 in: 1, 16, 81, 100. The total count is then 4.
nb_dig(25, 1) returns 11 since
the k*k that contain the digit 1 are:
1, 16, 81, 100, 121, 144, 169, 196, 361, 441.
So there are 11 digits 1 for the squares of numbers between 0 and 25.
Note that 121 has twice the digit 1.
(必須通過以下測試)
(ns countdig.core-test
  (:require [clojure.test :refer :all]
            [countdig.core :refer :all]))
(defn test-assert [act exp]
  (is (= act exp)))
  
(deftest a-test1
  (testing "nb-dig"
     (test-assert(nb-dig 5750, 0), 4700)
     (test-assert(nb-dig 11011, 2), 9481)
     (test-assert(nb-dig 12224, 8), 7733)
     (test-assert(nb-dig 11549, 1), 11905)
))
【我的答案】
(ns countdig.core)
(defn nb-dig [n d]
  (let [dict (->> n
               inc
               range
               (map #(str (* % %)))
               (clojure.string/join "")
               frequencies)]
    (get dict (first (str d))))
  )
;; 看完別人答案後,嘗試用 re-seq / re-pattern 組合技 寫出另個版本
(ns countdig.core)
(defn nb-dig [n d]
  (->>
    (range (inc n))
    (map #(str (* % %)))
    (clojure.string/join "")
    (re-seq (re-pattern (str d)))
    count)
  )
【其他人的答案】
(ns countdig.core)
(defn nb-dig [n d]
  ((->> (range (inc n))
        (mapcat #(str (* % %)))
        frequencies)
   (first (str d))))
(ns countdig.core)
(defn nb-dig [n d]
  (->> (inc n)
       (range)
       (map #(* % %))
       (map str)
       (filter #(clojure.string/includes? % (str d)))
       (map #(count (re-seq (re-pattern (str d)) %)))
       (reduce +)))